package juc.mysynchronized;

/**
 * @ClassName ReentrantLockExample
 * @PackageName juc.mysynchronized
 * @projectName myThread
 * @Description TODO
 * @Author games
 * @Date 2025/9/4 下午3:02
 * @Version 1.0
 */
import java.util.concurrent.locks.ReentrantLock;

/**
 * 1. ReentrantLock（可重入的独占锁）
 * 应用场景：
 *
 * 解决多线程竞争资源的问题，例如多个线程同时对同一个数据库进行写操作。
 * 实现多线程任务的顺序执行。
 * 实现多线程等待/通知机制。
 *
 * ReentrantLock 使用说明
 * ReentrantLock 是 Java 并发包中的一个可重入互斥锁，它提供了与 synchronized 关键字类似的锁功能，但具有更高的灵活性和更丰富的特性。
 * 基本概念
 * 核心特性
 * 可重入性：同一线程可以多次获取同一把锁
 * 独占性：同一时刻只有一个线程能持有锁
 * 公平性：支持公平锁和非公平锁模式
 * 条件变量：支持多个条件变量
 * 构造函数
 *
 *
 * // 默认构造函数（非公平锁）
 * ReentrantLock lock1 = new ReentrantLock();
 *
 * // 指定公平性模式的构造函数
 * ReentrantLock lock2 = new ReentrantLock(true);  // 公平锁
 * ReentrantLock lock3 = new ReentrantLock(false); // 非公平锁（默认）
 *
 *
 * 基本锁定操作
 * lock()：获取锁，如果锁不可用则阻塞
 * unlock()：释放锁
 * tryLock()：尝试获取锁，立即返回 true/false
 * tryLock(long timeout, TimeUnit unit)：在指定时间内尝试获取锁
 * 查询方法
 * isLocked()：查询锁是否被任何线程持有
 * isHeldByCurrentThread()：当前线程是否持有锁
 * getHoldCount()：当前线程持有锁的次数
 * getQueueLength()：等待获取锁的线程数
 *
 *
 */
public class ReentrantLockExample {
    private final ReentrantLock lock = new ReentrantLock();

    public void writeData() {
        lock.lock();
        try {
            // 模拟写操作
            System.out.println(Thread.currentThread().getName() + " is writing data.");
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }

    public static void main(String[] args) {
        ReentrantLockExample example = new ReentrantLockExample();

        for (int i = 0; i < 5; i++) {
            new Thread(() -> example.writeData()).start();
        }
        for (int i = 0; i < 5; i++) {
            System.out.println(Thread.currentThread().getName() + " is writing data.");
        }

    }
}
